/* 
 *  Description  เอาไว้คำนวนส่วน ในกรณี  ที่มีรายการร่วม  
 *  แต่ส่วนนี้ยังไม่ได้   Where ที่เป็นวันที่ 
 */
 package df.bean.process;

import df.bean.db.conn.DBConnection;
import java.sql.ResultSet;
import java.sql.SQLException;

 /**
  * @author Mr.sarunyoo Keawsopa
  */

public class ProcessComposit {
	private DBConnection obj_conn = null;;
	private ResultSet rs  = null;
	private String hospital_code = "";
	private String date_start = "";
	private String date_end = "";
	//private double percent = 0;
	
    /* public static void main(String[] args) throws Exception{		
		try{
			 //  20101231
		    // System.out.print(new ProcessComposit().calculateComposite("00009", "20100101" , "20110525")? "pass" : "faila");  
			  
	         // System.out.print(new ProcessComposit().rollBackComposite("00009", "20100101" , "20110525")? "pass" : "fail");
			
		     new ProcessComposit().calculateComposite("00009", "20100101", "20110525");
			 
		} catch(Exception ex) { 
			System.out.print(" er : " + ex);
		}
    }  */
	
    public boolean calculateComposite(String hospital_code, String date_start, String date_end){ 
    	boolean action = false;  
    	this.hospital_code = hospital_code;  // set รหัสโรงพยาบาล 
    	this.date_start = date_start;		 // set วันที่เริ่มการคำนวน
    	this.date_end = date_end;		     // set วันที่สิ้นสุดการทำงาน
   	 
    	try{ 
    		
    	obj_conn = new DBConnection(); 
    	obj_conn.connectToLocal();
       	
        this.backupSsoTransaction();  			//  back up data before
    	this.rs = this.getResultComposite();    //  ค้นหารายการที่เป็น "ประกันสังคม"
    	
    			while(this.rs.next()){  // ดึงรายการแต่ละ   LINE_NO    		
    			     //  System.out.println(this.rs.getString("LINE_NO"));
    				 //  Check   is  handicraft    ตรวจว่า   Order Item  เป็น "หัตถการ" หรือเปล่า 
    				if(this.checkIsHandicraft(this.rs.getString("LINE_NO"))) {  	// ไม่ใช่  "หัตถการ"	
    					//  System.out.println("----------------- ไม่ใช่หัตการ   Add Requrce -----------------------");
    					//  ตรวจสอบรายการที่ำเป็น  "ประกันสังคม  และ  ไม่เป็นหัตถการ "
    					this.toPaidCompositeIsNoHandicraft(this.rs.getString("LINE_NO"));	
    				} else { 
    					//  System.out.println("----------------- หัตถการ  -----------------------");
    					//  กรณีที่เป็นประกันสังคมและเป็นรายการที่เป็นหัตถการ จะจ่ายเงื่อนไขเฉพาะอัตราส่วน (%)
    					//  กรณีที่เป็นรายการหัตถการและมีการแบ่งบิล ระบบจะรวมทุกรายการและมาคำนวณส่วนแบ่งด้วยอัตราประกันสังคม และนำมาเทียบกับ ส่วนแบ่งรวมที่ไม่รวมประกันสังคม
    					this.toPaidComposite(this.rs.getString("LINE_NO"));
    				}
    			}
        	action = true;	
    	} catch(Exception ex) { 
    		 System.out.print(ex);
    	} finally {
    	   this.obj_conn.Close();
        }
    	return action;
	}
    private void toPaidCompositeIsNoHandicraft(String line_no) { // เป็นจ่ายในส่วน  ที่รายการ  ไม่ใช่ "หัตถการ"

    	// double  sumSc  = this.getSumIsHandicaft(line_no);
    	try { 
    		double  sumWI  = this.getSumWalkinAndContact(line_no);  // sum DR_AMT is not composite
    		double  sumSC  = this.getSumScForHandicraft(line_no);   // sum DR_AMT is composite
    		double  fixRate =  this.getValueFixPrice(line_no);    //  value   NOR_ALLOCATE_AMT 
    	    
    		// condition check  paid  df
    		if(sumWI > sumSC) { 
    			if(sumWI < fixRate) { //  กรณี   ผลรวม "ไม่ใช่" รายการประกันสังคม   มากกว่า ผลรวมรายการประกันสังคม  แต่น้อยกว่า  จากการ Fix Rate  ไว้
    				this.updateIsNotHandLessRatePaid(line_no);
    				//System.out.println(" 1 ");
    		    } else {    // กรณที่    ผลรวม   sumWI มากกว่า  sumSC  แต่น้อยกว่า     fixRate 
    				this.updateIsNotHandPaid(line_no);
    				//System.out.println(" 2 ");
    		    }
    		}else{ 
    			if(sumSC < fixRate) {  //  paid Real 
    				this.updateIsNotScPaidReal(line_no);
    			    //System.out.println(" 3 ");
    			} else { // กรณที่   Maximum ของ  Fix Rat fo NOR_ALLOCATE_AMT
        			this.updateIsNotHandScMax(line_no);  // ในกรณีนี้จึงได้กำหนดให้   เอารายการประกันสังคม .. เป็นรายการจ่าย   แทน
        			//System.out.println(" 4 ");
    			}
    		}
    	} catch(Exception ex) { 
    		System.out.println(ex);
    	}
	}
    private boolean updateIsNotScPaidReal(String line_no) {
    	boolean action = false; 
		StringBuilder  sql = new  StringBuilder();
		sql.append("UPDATE TRN_DAILY  SET ");
		sql.append(" DR_AMT  =  0 , ");
		sql.append(" HP_AMT  = 0 ,  "); //  ค้างเรื่องภาษีอยุ่นะครับผม..
		sql.append(" DR_TAX_400 = 0 , ");
		sql.append(" DR_TAX_401 = 0 , ");
		sql.append(" DR_TAX_402 = 0 , ");
		sql.append(" DR_TAX_406 = 0 ");
		sql.append(" WHERE LINE_NO  = '").append(line_no).append("'");
		sql.append(" AND HOSPITAL_CODE  = '").append(this.hospital_code).append("'");
		sql.append(" AND TRANSACTION_DATE  BETWEEN '").append(this.date_start).append("' AND '").append(this.date_end).append("'");
		sql.append(" AND PAYOR_OFFICE_CODE  NOT IN  (");
		sql.append("  SELECT PAYOR_OFFICE_CODE_SC FROM  PAYOR_OFFICE_SC WHERE  HOSPITAL_CODE = '").append(this.hospital_code).append("'");
		sql.append(" ) ");
		sql.append(" AND ACTIVE  = 1 ");
		try{ 
			   if(this.obj_conn.executeUpdate(sql.toString()) != -1 ) { 
				   action  = true;
			   }
		 }catch(Exception ex){
			 System.out.println(ex);
		 }
		 
		return action;
	}
	private boolean updateIsNotHandScMax(String line_no) {
			boolean  action = false;
			StringBuilder  sql = new StringBuilder();
			sql.append("UPDATE TRN_DAILY  SET ");
			sql.append(" DR_AMT = 0 , ");
			sql.append(" HP_AMT = 0 , ");  
			sql.append(" DR_TAX_400 = 0 , ");
			sql.append(" DR_TAX_401 = 0 , ");
			sql.append(" DR_TAX_402 = 0 , ");
			sql.append(" DR_TAX_406 = 0 ");
			sql.append(" WHERE LINE_NO = '").append(line_no).append("'");
			sql.append(" AND  HOSPITAL_CODE = '").append(this.hospital_code).append("'");
			sql.append(" AND  TRANSACTION_DATE BETWEEN '").append(this.date_start);
			sql.append("' AND '").append(this.date_end).append("'");
			sql.append(" AND  PAYOR_OFFICE_CODE NOT IN ( "); // กรณี..
			sql.append(" SELECT  PAYOR_OFFICE_CODE_SC FROM PAYOR_OFFICE_SC  WHERE  HOSPITAL_CODE  = '");
			sql.append(this.hospital_code).append("'");
			sql.append(" ) ");
			
			try { 
				if(this.obj_conn.executeUpdate(sql.toString()) != -1){ 
					action = true;
				}
			}catch(Exception ex){ 
				 System.out.println(ex);
			}
		 return action;
	}
	private boolean updateIsNotHandLessRatePaid(String line_no) {
		
		boolean action = false ;
		
		StringBuilder  sql  = new  StringBuilder();
		
		sql.append("UPDATE TRN_DAILY  SET  ");
		sql.append(" DR_AMT = NOR_ALLOCATE_AMT , ");  // เป็นการ กำหนด  เอาค่าสูงสุด จาก  Allocate มาเลย .. 
		//sql.append(" HP_AMT = ( AMOUNT_AFT_DISCOUNT - DR_AMT ) , ");  // เป็นกาำรคำนวนส่วนแ่บ่ง   HP_AMT
		sql.append(" HP_AMT = ( AMOUNT_AFT_DISCOUNT - NOR_ALLOCATE_AMT ) , ");  //  ใช้ได้กรณี สำรอง .. 
		sql.append(" DR_TAX_400 = CASE WHEN TAX_TYPE_CODE = '400' THEN DR_AMT * TAX_RATE ELSE 0 END, ");
		sql.append(" DR_TAX_401 = CASE WHEN TAX_TYPE_CODE = '401' THEN DR_AMT * TAX_RATE ELSE 0 END, ");
		sql.append(" DR_TAX_402 = CASE WHEN TAX_TYPE_CODE = '402' THEN DR_AMT * TAX_RATE ELSE 0 END, ");
		sql.append(" DR_TAX_406 = CASE WHEN TAX_TYPE_CODE = '406' THEN DR_AMT * TAX_RATE ELSE 0 END ");		
		sql.append(" WHERE  INVOICE_NO = ( "); // เพื่อไม่ใหหลุดเงือนไข  ก็เลยหา  INVOICE เป็นเงื่อนไขในการ  Update อีกครั้งหนึ่ง		
		sql.append(" SELECT INVOICE_NO FROM TRN_DAILY  ");
		sql.append(" WHERE LINE_NO  = '").append(line_no).append("'");
		sql.append(" AND HOSPITAL_CODE = '").append(this.hospital_code).append("'");
		sql.append(" AND PAYOR_OFFICE_CODE IN (");
		sql.append(" SELECT PAYOR_OFFICE_CODE_SC  FROM PAYOR_OFFICE_SC WHERE HOSPITAL_CODE = '").append(this.hospital_code).append("'");
		sql.append(" ) ) ").append(" AND LINE_NO = '").append(line_no).append("'");
		sql.append(" AND HOSPITAL_CODE = '").append(this.hospital_code).append("'");
		sql.append(" AND TRANSACTION_DATE BETWEEN '").append(this.date_start).append("' AND '").append(this.date_end).append("'");
		sql.append(" AND ACTIVE = 1 ");
		
		StringBuilder sql_not_sc  =  new StringBuilder();
		
		sql_not_sc.append("UPDATE TRN_DAILY  SET ");
		sql_not_sc.append(" DR_AMT = 0 , ");  //  ติดอยุ่ตรงนี้ละ เรื่องส่วนแบ่งของโรงพยาบาลนะครับผม
		sql_not_sc.append(" HP_AMT = 0 , ");
		sql_not_sc.append(" DR_TAX_400 = 0 , ");
		sql_not_sc.append(" DR_TAX_401 = 0 , ");
		sql_not_sc.append(" DR_TAX_402 = 0 , ");
		sql_not_sc.append(" DR_TAX_406 = 0 ");
		sql_not_sc.append(" WHERE  LINE_NO = '").append(line_no).append("'");
		sql_not_sc.append(" AND HOSPITAL_CODE  = '").append(this.hospital_code).append("'");
		sql_not_sc.append(" AND TRANSACTION_DATE BETWEEN '").append(this.date_start);
		sql_not_sc.append("' AND '").append(this.date_end).append("'");
		sql_not_sc.append(" AND PAYOR_OFFICE_CODE  NOT IN (");  // กำหนดให้รายการ ..  ที่ไม่ใช่ประกันสังคม .. ไม่เป็นรายจ่าย
		sql_not_sc.append("  SELECT PAYOR_OFFICE_CODE_SC FROM  PAYOR_OFFICE_SC WHERE HOSPITAL_CODE = '");
		sql_not_sc.append(this.hospital_code).append("'").append(" ) ");
		sql_not_sc.append(" AND ACTIVE = 1 ");
		
		try{ 
			if(this.obj_conn.executeUpdate(sql.toString()) != -1 ) {  // เป็นการคิดคำนวนส่วนที่เป็น รายกาำรประกันสังคมก่อน 
				// Sql one  Query complete 
				if(this.obj_conn.executeUpdate(sql_not_sc.toString()) != -1) { // เป็นการคำนวนส่วนทีเป็น ไม่ใช่ประกันสังคม เพราะมีการปรับปรุง  หลังจาก  รายการประกันสังคม 
					 action  = true;
				}			
			}
		}catch(Exception ex) { 
			System.out.println(ex);
		}
		return action;
	}
	private  boolean  updateIsNotHandPaid(String line_no) {
		boolean action  = false;
		StringBuilder  sql = new StringBuilder();
		sql.append("UPDATE  TRN_DAILY  SET  ");
		sql.append(" DR_AMT = 0 , ");
		sql.append(" HP_AMT = 0 , ");  
		sql.append(" DR_TAX_400 = 0 , ");
		sql.append(" DR_TAX_401 = 0 , ");
		sql.append(" DR_TAX_402 = 0 , ");
		sql.append(" DR_TAX_406 = 0 ");
		sql.append(" WHERE  INVOICE_NO  = ( "); // เพื่อไม่ใหหลุดเงือนไข  ก็เลยหา  INVOICE เป็นเงื่อนไขในการ  Update อีกครั้งหนึ่ง		
		sql.append(" SELECT INVOICE_NO FROM TRN_DAILY  ");
		sql.append(" WHERE LINE_NO  = '").append(line_no).append("'");
		sql.append(" AND HOSPITAL_CODE = '").append(this.hospital_code).append("'");
		sql.append(" AND PAYOR_OFFICE_CODE IN (");
		sql.append(" SELECT PAYOR_OFFICE_CODE_SC  FROM PAYOR_OFFICE_SC WHERE HOSPITAL_CODE = '").append(this.hospital_code).append("'");
		sql.append(" ) ) ");
		sql.append(" AND LINE_NO = '").append(line_no).append("'");
		sql.append(" AND HOSPITAL_CODE = '").append(this.hospital_code).append("'");
		sql.append(" AND TRANSACTION_DATE BETWEEN '").append(this.date_start).append("' AND '").append(this.date_end).append("'");
		sql.append(" AND ACTIVE = 1 ");
		
		try{ 
			if(this.obj_conn.executeUpdate(sql.toString()) != -1) { 
				action = true;
			}
		}catch(Exception ex) { 
			 System.out.println(ex);
		}
		
		return action;
	}
	private double getValueFixPrice(String line_no) {
		// TODO Auto-generated method stub
		double  valueReturn  = 0.0 ;
		StringBuilder  sql = new StringBuilder();
		
		sql.append("SELECT NOR_ALLOCATE_AMT FROM TRN_DAILY ");
		sql.append("WHERE LINE_NO = '").append(line_no).append("'");
		sql.append(" AND HOSPITAL_CODE = '").append(this.hospital_code).append("'");
		sql.append(" AND TRANSACTION_DATE BETWEEN '").append(this.date_start).append("' AND '").append(this.date_end).append("'");
		sql.append(" AND PAYOR_OFFICE_CODE IN ( ");
		sql.append(" SELECT PAYOR_OFFICE_CODE_SC FROM PAYOR_OFFICE_SC WHERE HOSPITAL_CODE = '").append(this.hospital_code).append("'");
		sql.append(" )");
		
		try{ 
			 valueReturn = Double.parseDouble(this.obj_conn.executeQueryString(sql.toString()));	
		}catch(Exception ex){ 
			System.out.println();
		}
		return  valueReturn;
	}
	private double getSumScForHandicraft(String line_no) {
		// TODO Auto-generated method stub
		StringBuilder  sql = new StringBuilder();
		double valueReturn = 0.0;
		ResultSet rs_sum = null;
	    sql.append("SELECT SUM(DR_AMT) AS ALLOCATE FROM TRN_DAILY ");
	    sql.append(" WHERE  LINE_NO = '").append(line_no).append("'");
	    sql.append(" AND HOSPITAL_CODE = '").append(this.hospital_code).append("'");
		sql.append(" AND TRANSACTION_DATE BETWEEN '").append(this.date_start).append("' AND '").append(this.date_end).append("'");
	    sql.append(" AND PAYOR_OFFICE_CODE  IN ( ");
	    sql.append("  SELECT PAYOR_OFFICE_CODE_SC  FROM PAYOR_OFFICE_SC WHERE  HOSPITAL_CODE = '").append(this.hospital_code).append("'");
	    sql.append(" ) ");
	   
		try  { 
			 rs_sum  = this.obj_conn.executeQuery(sql.toString());
			 if(rs_sum.next()) { 
				  valueReturn =  rs_sum.getDouble("ALLOCATE");
			 }
		}catch(Exception ex) { 
			System.out.println(ex);
		}
		return valueReturn;
	}
	private boolean checkIsHandicraft(String line_no) {
    	// ตรวจสอบรายกาำร  Order Item ที่เป็นรายการ ประกันสังคม	  ว่าเป็น  "หัตถการ" หรือเปล่า      
    	// is Handicraft return true 
    	
    	boolean action = false;
    	
    	StringBuilder sql  = new StringBuilder();
    	String value;
    	sql.append("SELECT * FROM  TRN_DAILY  ");
    	sql.append(" WHERE  LINE_NO = '").append(line_no).append("'");
    	sql.append(" AND HOSPITAL_CODE  = '").append(this.hospital_code).append("'");
    	sql.append(" AND TRANSACTION_DATE BETWEEN '").append(this.date_start).append("' AND '").append(this.date_end).append("'");
    	sql.append(" AND ACTIVE = 1");
    	sql.append(" AND  ORDER_ITEM_CODE IN (");
    	sql.append(" SELECT  CODE  FROM  ORDER_ITEM  WHERE  HANDICRAFT = 'Y'");
    	sql.append(" AND HOSPITAL_CODE = '").append(this.hospital_code).append("'");
    	sql.append(" ) ").append(" AND NOR_ALLOCATE_AMT > 0");
    	
    	 System.out.println(sql.toString());
    	try { 
    		
    		value  = this.obj_conn.executeQueryString(sql.toString());
    		
    		if(!"".equals(value) &&  value != null) {  
    			action = true ;
    		}
    		
    	}catch(Exception ex) {
    		System.out.println(ex);
    	}
		return action;
	}
	private boolean backupSsoTransaction(){
    	boolean action = false;
    	StringBuilder sql =  new StringBuilder();
    	sql.append("UPDATE TRN_DAILY ");
    	sql.append(" SET OLD_DR_AMT = DR_AMT, HP_TAX = HP_AMT, ");
    	sql.append(" OLD_TAX_AMT = DR_TAX_400+DR_TAX_401+DR_TAX_402+DR_TAX_406, ");
    	sql.append(" OLD_NOR_ALLOCATE_PCT = NOR_ALLOCATE_PCT , ");
    	sql.append(" OLD_NOR_ALLOCATE_AMT = NOR_ALLOCATE_AMT ");  //  มีการเพิ่ม   field ขึ้นมาใหม่   เพื่อเป็นการ  Back Up data  
    	sql.append(" WHERE HOSPITAL_CODE = '").append(this.hospital_code).append("' AND ");
    	sql.append(" (TRANSACTION_DATE BETWEEN '").append(this.date_start).append("' AND '").append(this.date_end).append("') AND ");
    	sql.append(" LINE_NO IN (SELECT LINE_NO FROM TRN_DAILY  WHERE LINE_NO IN (");
    	sql.append(" SELECT LINE_NO FROM TRN_DAILY TD ");
    	sql.append(" INNER JOIN PAYOR_OFFICE_SC POS ON POS.PAYOR_OFFICE_CODE_SC = TD.PAYOR_OFFICE_CODE ");
    	sql.append(" AND POS.HOSPITAL_CODE = TD.HOSPITAL_CODE ");
    	sql.append(" WHERE TD.HOSPITAL_CODE = '").append(this.hospital_code).append("' ) ");
    	sql.append(" AND HOSPITAL_CODE = '").append(this.hospital_code).append(" ' ");
    	sql.append(" AND ACTIVE  = '1' ");
    	sql.append(" AND TRANSACTION_DATE BETWEEN '").append(this.date_start).append("' AND '").append(this.date_end).append(" ' ");
    	sql.append(" GROUP BY LINE_NO HAVING COUNT(LINE_NO) > 1)");
    	try{	
    		if( obj_conn.executeUpdate(sql.toString()) != -1 ) { 
    			action  = true;
    		}
    	}catch(Exception e){
    		System.out.println("Backup SSO Transaction error :  " + e);
    	}
    	return action;
    }
	private double getPercent(String lineNo){
		String percentage = "";
		double temp_percentage = 0;
		String sql = "SELECT TOP 1 NOR_ALLOCATE_PCT FROM TRN_DAILY TD "+
		"INNER JOIN PAYOR_OFFICE_SC POS ON POS.PAYOR_OFFICE_CODE_SC = TD.PAYOR_OFFICE_CODE "+
		"AND POS.HOSPITAL_CODE = TD.HOSPITAL_CODE "+
		"WHERE TD.HOSPITAL_CODE = '" + this.hospital_code + "' AND LINE_NO = '" +lineNo+"' "+
		"AND (TRANSACTION_DATE BETWEEN '" + this.date_start + "' AND '" + this.date_end + "')";
		percentage = obj_conn.executeQueryString(sql);
		if("".equals(percentage) || percentage == null){				 //  กรณีไม่มีรายการ...
			temp_percentage  = 0.32;    // กำหนดค่าเริ่ม ต้น   กรณี ..ที่  รายการ  ประกันสังคม  ไม่มีค่าอะไร..
		} else  { 
			temp_percentage  =  Double.parseDouble(percentage) / 100;   // กำำหนดให้รายการเป็นดังนี้   .9  or  .97   
		}
		
		return temp_percentage;
	}
	private ResultSet getResultComposite(){ 
		StringBuilder sql = new StringBuilder();
		sql.append("SELECT LINE_NO FROM TRN_DAILY  WHERE LINE_NO IN (");
		sql.append(" SELECT LINE_NO FROM TRN_DAILY TD");     
		sql.append(" INNER JOIN PAYOR_OFFICE_SC POS ON POS.PAYOR_OFFICE_CODE_SC = TD.PAYOR_OFFICE_CODE");    
		sql.append(" WHERE TD.HOSPITAL_CODE = '").append(this.hospital_code).append("' )"); 
		sql.append(" AND HOSPITAL_CODE = '").append(this.hospital_code).append("'"); 
		sql.append(" AND ACTIVE  = '1'");  //  ตรวจสอบเรื่องทำงานของ Record
		sql.append(" AND  TRANSACTION_DATE BETWEEN '").append(this.date_start).append("' AND '").append(this.date_end).append("'");
		sql.append(" GROUP BY LINE_NO"); 
		sql.append(" HAVING COUNT(LINE_NO) > 1 ");
		
		//System.out.println(sql.toString());
		return  this.obj_conn.executeQuery(sql.toString());
	}
    private int toPaidComposite(String line_no) throws Exception{ 
    	
    	double sumSc = 0;
    	double sumWalkIn = 0 ;
    	double sscPercent = 0;
    	int actionRecord = 0 ;
		
    	sscPercent = this.getPercent(line_no);  
    	sumSc = this.getSumSC(line_no , sscPercent);  // รวมยอด ทั้งหมด  รายการที่เป็นประกันสังคม
    	sumWalkIn =  this.getSumWalkinAndContact(line_no); // รวมยอด ทั้งหมด  รายการที่เป็น  ผู้ป่วยทั่วไป    และ  ประกันสุขภาพ 
		
    	if(sumSc > sumWalkIn) {   	 				// กรณีที่จ่ายด้วยประกันสังคม 
    		this.paidSsc(line_no); 
    	    // System.out.println("5");
    		actionRecord =  1; 						// ทำเพื่อเก็บ..จำนวนครั้งทำที่ได้	 
    	}else{ 			 							// กรณีให้ "ผู้่ป่วยทั่วไป  และ ประกันสุขภาพ" จ่าย 
    		this.paidWalkInContract(line_no);
    		// System.out.println("6");
    		actionRecord =  1;  					// ทำเพื่อเก็บ..จำนวนครั้งที่ทำได้
    	}			  	  
		  
    	sumSc = 0;		// set default
    	sumWalkIn = 0;	// set default 
    	return actionRecord;
    }
    private double getSumSC(String line_no ,  double percentTax) {
    	double  price_amt  = 0.0;
		StringBuilder  sql =  new StringBuilder();
		ResultSet  rs_get_price_sc = null;
		sql.append("SELECT AMOUNT_AFT_DISCOUNT, NOR_ALLOCATE_PCT FROM  TRN_DAILY");
		sql.append(" WHERE  HOSPITAL_CODE = '").append(this.hospital_code).append("'");
	    sql.append(" AND  LINE_NO = '").append(line_no).append("'");
	    sql.append(" AND  TRANSACTION_DATE BETWEEN '").append(this.date_start).append("' AND '").append(this.date_end).append("'");
	    sql.append(" AND  ACTIVE = 1");
		
		try {	
			this.obj_conn.connectToLocal();
			rs_get_price_sc = obj_conn.executeQuery(sql.toString());
			while(rs_get_price_sc.next()) { 
				//  กำหนดค่ารวมแต่ละรายการำ
				price_amt += rs_get_price_sc.getDouble("AMOUNT_AFT_DISCOUNT") *  percentTax;
			}
		} catch(Exception ex ){ 
			System.out.print(ex);
		} finally{
		 // rs_get_price_sc.close(); 
			
		}
		// return value
		return price_amt;
	}
    private double getSumWalkinAndContact(String line_no) throws Exception {
		double priceReturn  = 0.0 ;		
		StringBuilder  sql = new StringBuilder();
		ResultSet rs_get_price_walk = null;
		try { 		
			sql.append("SELECT  SUM(DR_AMT) AS SUMWI FROM  TRN_DAILY");
			sql.append(" WHERE HOSPITAL_CODE  = '").append(this.hospital_code).append("'");
			sql.append(" AND LINE_NO = '").append(line_no).append("'");
			sql.append(" AND PAYOR_OFFICE_CODE NOT IN ( SELECT PAYOR_OFFICE_CODE_SC FROM PAYOR_OFFICE_SC )");   //  is sum  not composition 
			sql.append(" AND TRANSACTION_DATE BETWEEN '").append(this.date_start).append("' AND '").append(this.date_end).append("'");
			sql.append(" AND ACTIVE = 1");
			//System.out.println(sql.toString());
			
			this.obj_conn.connectToLocal();
			rs_get_price_walk =  obj_conn.executeQuery(sql.toString());
			if(rs_get_price_walk.next()) {
				 priceReturn =  rs_get_price_walk.getDouble("SUMWI");
			}
		} catch(Exception ex) {
			System.out.print("Error Exception : " + ex);
		} finally {
			//rs_get_price_walk.close();
		}
		//return value walk in & contact
		return priceReturn;
	}
    public boolean rollBackComposite(String hospital_code, String date_start, String date_end) { 
    	obj_conn = new DBConnection();
    	obj_conn.connectToLocal();
    	boolean action = false;
     	StringBuilder sql = new StringBuilder();
     	
     	// ส่วนนี้ ผมไม่ค่อยแน่ใจเท่าไรนะครับผม
     	sql.append(" UPDATE TRN_DAILY ");
     	sql.append(" SET ");
     	sql.append(" DR_AMT = OLD_DR_AMT, OLD_DR_AMT = 0, ");
     	sql.append(" HP_AMT = HP_TAX,  HP_TAX  = 0, ");
     	sql.append(" NOR_ALLOCATE_PCT = OLD_NOR_ALLOCATE_PCT, OLD_NOR_ALLOCATE_PCT = 0, ");
     	sql.append(" NOR_ALLOCATE_AMT = OLD_NOR_ALLOCATE_AMT, OLD_NOR_ALLOCATE_AMT = 0 , ");  //  new field
     	sql.append(" DR_TAX_400 = CASE WHEN TAX_TYPE_CODE = '400' THEN OLD_TAX_AMT ELSE 0 END, ");   //  400  
	    sql.append(" DR_TAX_401 = CASE WHEN TAX_TYPE_CODE = '401' THEN OLD_TAX_AMT ELSE 0 END, "); 	  //  401
	    sql.append(" DR_TAX_402 = CASE WHEN TAX_TYPE_CODE = '402' THEN OLD_TAX_AMT ELSE 0 END, ");	  //  402
	    sql.append(" DR_TAX_406 = CASE WHEN TAX_TYPE_CODE = '406' THEN OLD_TAX_AMT ELSE 0 END, ");      //  406
      	sql.append(" OLD_TAX_AMT = 0 ");    														      //  set  OLD_TAX_AMT  defalt 0
	    sql.append(" WHERE HOSPITAL_CODE = '").append(hospital_code).append("' ");
     	sql.append(" AND TRANSACTION_DATE BETWEEN '").append(date_start).append("' AND '").append(date_end).append("' ");
     	sql.append(" AND  OLD_NOR_ALLOCATE_PCT > 0 "); // ตามข้อตกลงกัน  เอา OLD_NOR_ALLOCATE_PCT  เป็นตัว check  ว่า รายการใด .. นั้น.. ได้ทำเสร็จแล้ว.. แล้วจะมา ตรวจสอบการทำงาน ..  เพื่อที่จะ Rollback Data bases
     	sql.append(" AND OLD_NOR_ALLOCATE_PCT IS NOT NULL "); 
     	sql.append(" OR OLD_NOR_ALLOCATE_AMT  >  0  AND  OLD_NOR_ALLOCATE_AMT IS NOT NULL ");

     	try{
     		action = this.obj_conn.executeUpdate(sql.toString())>= 0 ? true : false;
     	} catch(Exception ex) {
     		this.obj_conn.Close();
     	 	System.out.println(ex);     			
     	} finally {
     		this.obj_conn.Close();
     	}
     	return action;
    }      
    private int paidSsc(String line_no) throws Exception { 
    	int actionRecord  = 0;
    	double percent = this.getPercent(line_no);
		StringBuilder  sql =  new StringBuilder();
		
		sql.append("UPDATE TRN_DAILY ");
		sql.append("SET DR_AMT = AMOUNT_AFT_DISCOUNT * ").append(percent).append(" , ");
		sql.append("DR_TAX_400 = CASE WHEN TAX_TYPE_CODE = '400' THEN DR_AMT * TAX_RATE ELSE 0 END, ");
		sql.append("DR_TAX_401 = CASE WHEN TAX_TYPE_CODE = '401' THEN DR_AMT * TAX_RATE ELSE 0 END, ");
		sql.append("DR_TAX_402 = CASE WHEN TAX_TYPE_CODE = '402' THEN DR_AMT * TAX_RATE ELSE 0 END, ");
		sql.append("DR_TAX_406 = CASE WHEN TAX_TYPE_CODE = '406' THEN DR_AMT * TAX_RATE ELSE 0 END, ");		 
		sql.append("NOR_ALLOCATE_PCT = ").append(percent * 100).append(" , ");  // format เป็น  70  หรือ เป็นเต็มร้อยนั้นเอง     ร้อย  32.00
		sql.append("HP_AMT = AMOUNT_AFT_DISCOUNT - (AMOUNT_AFT_DISCOUNT * ").append(percent).append(") ");
		sql.append("WHERE HOSPITAL_CODE  = '").append(this.hospital_code).append("' ");
		sql.append("AND LINE_NO = '").append(line_no).append("' ");
		sql.append("AND TRANSACTION_DATE  BETWEEN '").append(this.date_start).append("' AND '").append(this.date_end).append("'");
		try{
			 		if(obj_conn.executeUpdate(sql.toString()) != -1) { 
			 			actionRecord = 1;
			 		}
		 } catch(Exception ex) {
			 System.out.println(ex);
		 }
		return  actionRecord;
	}
	private int paidWalkInContract(String line_no)throws Exception{ 
		StringBuilder sql_update = new StringBuilder();
		int  recordComplete  = 0 ;
		sql_update.append("UPDATE TRN_DAILY SET");
		sql_update.append(" DR_AMT = 0, ");				// DR_AMT  ส่วนแบ่ง แพทย์
		sql_update.append(" HP_AMT  = 0, ");			// HP_AMT  ส่วนแบ่ง  โรงพยาบาล
		sql_update.append(" NOR_ALLOCATE_PCT = 0, ");   // NOR_ALLOCATE_PCT  
		sql_update.append(" DR_TAX_400 = 0, ");
		sql_update.append(" DR_TAX_401 = 0, ");
		sql_update.append(" DR_TAX_402 = 0, ");
		sql_update.append(" DR_TAX_406 = 0 ");
		sql_update.append(" WHERE  HOSPITAL_CODE = '").append(this.hospital_code).append("'");
		sql_update.append(" AND LINE_NO = '").append(line_no).append("'");
		sql_update.append(" AND PAYOR_OFFICE_CODE IN (SELECT PAYOR_OFFICE_CODE_SC FROM PAYOR_OFFICE_SC WHERE HOSPITAL_CODE = '").append(this.hospital_code).append("')");
		//sql_update.append(" AND INVOICE_NO = '").append(invoice_no).append("'");
		sql_update.append(" AND TRANSACTION_DATE BETWEEN '").append(this.date_start).append("' AND '").append(this.date_end).append("'");
		try{
				if(obj_conn.executeUpdate(sql_update.toString()) !=  -1)  { 
					recordComplete = 1; 
				}
		} catch(Exception ex){
			System.out.print(ex);
		}
		return recordComplete;
	}
} // end class

